import { getSignature } from "@/api/common.js";

export function initConfig({ jsApiList }) {
  return new Promise((resolve, reject) => {
    const param = {
      url: window.location.href.split("#")[0],
    };

    const list = jsApiList ? ["checkJsApi", ...jsApiList] : [];
    // 获取config参数
    getSignature(param)
      .then((res) => {
        // 初始化config
        let params = {
          beta: true, // 必须这么写，否则wx.invoke调用形式的jsapi会有问题
          debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
          appId: res.data?.corpId, // 必填，企业微信的corpID
          timestamp: res.data?.permission?.timestamp, // 必填，生成签名的时间戳
          nonceStr: res.data?.permission?.nonceStr, // 必填，生成签名的随机串
          signature: res.data?.permission?.signature, // 必填，签名，见 附录-JS-SDK使用权限签名算法
          jsApiList: list, // 必填，需要使用的JS接口列表，凡是要调用的接口都需要传进来 ['hideOptionMenu']
        };
        console.log("wx config", params);
        wx.config(params);

        wx.ready(() => {
          console.log("wx.ready");
          // config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中。
          checkAPI(list)
            .then(() => {
              resolve(true);
            })
            .catch(() => {
              reject();
            });
        });

        wx.error((res) => {
          console.log("wx.error", res);
          // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
          reject(res);
        });
      })
      .catch((err) => {
        console.error("get config err", err);
        reject(err);
      });
  });
}

function checkAPI(jsApiList) {
  return new Promise((resolve, reject) => {
    wx.checkJsApi({
      jsApiList, // 需要检测的JS接口列表，所有JS接口列表见附录2,
      success: (res) => {
        // 以键值对的形式返回，可用的api值true，不可用为false
        // 如：{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
        console.log("checkAPI true", res);
        resolve(true);
      },
      fail: (res) => {
        console.log("checkAPI false", res);
        reject();
      },
    });
  });
}
